package com.onenine.app.model;

import android.os.Parcel;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;

import io.rong.imlib.MessageTag;
import io.rong.imlib.model.MessageContent;

/**
 * 创建时间：2018/6/4 0004 18:22
 * 创建人：fly
 * 功能描述：游戏聊天文本消息类型
 */
@MessageTag(value = GameTextMessage.OBJECT_NAME)
public class GameTextMessage extends MessageContent {

    public static final String OBJECT_NAME = "App:GameTextMsg";
    public static final String CONTENT_NAME = "content";

    private String mContent;

    /**
     * 发消息时调用，将自定义消息对象序列化为消息数据:
     * 首先将消息属性封装成json，再将json转换成byte数组
     */
    @Override
    public byte[] encode() {
        JSONObject jsonObject = new JSONObject();

        try {
            jsonObject.put(CONTENT_NAME, mContent);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        try {
            return jsonObject.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return null;
    }

    public GameTextMessage() {
    }

    /**
     * 将收到的消息进行解析，byte -> json,再将json中的内容取出赋值给消息属性
     */
    public GameTextMessage(byte[] data) {
        String jsonString = null;

        try {
            jsonString = new String(data, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            if (jsonObject.has(CONTENT_NAME)) {
                mContent = jsonObject.optString(CONTENT_NAME);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param in 通过初始化传入的Parcel，为消息属性赋值
     */
    private GameTextMessage(Parcel in) {
        mContent = in.readString();
    }

    /**
     * 读取接口，目的是要从Parcel中构造一个实现了Parcelable的类的实例处理
     */
    public static final Creator<GameTextMessage> CREATOR = new Creator<GameTextMessage>() {
        @Override
        public GameTextMessage createFromParcel(Parcel source) {
            return new GameTextMessage(source);
        }

        @Override
        public GameTextMessage[] newArray(int size) {
            return new GameTextMessage[size];
        }
    };

    /**
     * 描述了包含在Parcelable对象排列信息中的特殊对象的类型
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 将类的数据写入到外部提供的Parcel中
     *
     * @param dest  对象被写入的Parcel
     * @param flags 对象如何被写入的附加标志
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mContent);
    }

    public static GameTextMessage obtain(String content) {
        GameTextMessage message = new GameTextMessage();
        message.setContent(content);
        return message;
    }

    @Override
    public List<String> getSearchableWord() {
        return Arrays.asList(OBJECT_NAME);
    }

    public String getContent() {
        return mContent;
    }

    private void setContent(String mContent) {
        this.mContent = mContent;
    }

}
